home *** CD-ROM | disk | FTP | other *** search
/ The Fatted Calf / The Fatted Calf.iso / Applications / Games / NeXTGo / Source / smartgoparse.c < prev    next >
C/C++ Source or Header  |  1993-02-08  |  3KB  |  156 lines

  1. #include "comment.header"
  2.  
  3. #include <stdlib.h>
  4. #include "smartgo.h"
  5.  
  6. /*  Define the following when debugging the tree parsing algorithm.  */
  7. /*  #define _DEBUG_ON_  */
  8.  
  9. char *currentChar;
  10. int currentNodeNumber;
  11.  
  12. void add_node(node* cur_node, char* node_loc)
  13. {
  14.   node* new_node;
  15.  
  16.   new_node = (node *) malloc((size_t) sizeof(node));
  17.  
  18.   new_node->nodenum = currentNodeNumber++;
  19.   cur_node->next = new_node;
  20.   new_node->prev = cur_node;
  21.   new_node->parent = cur_node->parent;
  22.   new_node->properties = node_loc;
  23.   new_node->next = new_node->next_var = new_node->prev_var =
  24.     new_node->variants = NULL;
  25.  
  26. #ifdef _DEBUG_ON_
  27.   printf("Add, ");
  28. #endif
  29. }
  30.  
  31. void add_variant(node* parent)
  32. {
  33.   node *new_var, *tnode;
  34.  
  35.   new_var = (node *) malloc((size_t) sizeof(node));
  36.  
  37.   if (parent->variants == NULL)
  38.     {
  39.       parent->variants = new_var;
  40.       new_var->prev_var = NULL;
  41.     }
  42.   else
  43.     {
  44.       tnode = parent->variants;
  45.       while (tnode->next_var != NULL)
  46.     tnode = tnode->next_var;
  47.       tnode->next_var = new_var;
  48.       new_var->prev_var = tnode;
  49.     }
  50.  
  51.   new_var->parent = parent;
  52.   new_var->properties = NULL;
  53.   new_var->nodenum = 0;
  54.   new_var->next_var = new_var->variants = new_var->next = new_var->prev = NULL;
  55.  
  56. #ifdef _DEBUG_ON_
  57.   printf("Pop, ");
  58. #endif
  59. }
  60.  
  61. void do_variant(node* startNode)
  62. {
  63.   node *subNode, *currentNode;
  64.   int level = 0;
  65.  
  66.   currentNode = startNode;
  67.  
  68.   while ((*currentChar != ')') && (*currentChar != 0))
  69.     {
  70.       if (*currentChar == '\\')
  71.     {
  72.       currentChar++;
  73.     }
  74.       else if (*currentChar == '[')
  75.     {
  76.       level++;
  77.     }
  78.       else if (*currentChar == ']')
  79.     {
  80.       level--;
  81.     }
  82.       else if ((*currentChar == '(') && (level == 0))
  83.     {
  84. #ifdef _DEBUG_ON_
  85.       printf("Down, ");
  86. #endif
  87.  
  88.       add_variant(currentNode);
  89.       subNode = currentNode->variants;
  90.       while (subNode->next_var != NULL)
  91.         subNode = subNode->next_var;
  92.  
  93.       currentChar++;
  94.       do_variant(subNode);
  95.     }
  96.       else if ((*currentChar == ';') && (level == 0))
  97.     {
  98.       add_node(currentNode, currentChar);
  99.       currentChar++;
  100.       currentNode = currentNode->next;
  101.     }
  102.       currentChar++;
  103.       if ((*currentChar == ')') && (level != 0))
  104.     currentChar++;
  105.     }
  106.  
  107. /*  currentChar++;  */
  108.  
  109. #ifdef _DEBUG_ON_
  110.   printf("Up, ");
  111. #endif
  112. }
  113.  
  114. node* parse_tree(char* inputBuffer)
  115. {
  116.   node *rootNode, *subNode;
  117.  
  118.   rootNode = (node *) malloc((size_t) sizeof(node));
  119.   rootNode->properties = NULL;
  120.   rootNode->nodenum = 0;
  121.   rootNode->parent = rootNode->variants = rootNode->next_var =
  122.     rootNode->prev_var = rootNode->next = rootNode->prev = NULL;
  123.   currentNodeNumber = 0;
  124.  
  125.   currentChar = inputBuffer;
  126.  
  127.   while (*currentChar != '(')
  128.     currentChar++;
  129.  
  130.   while ((*currentChar != ')') && (*currentChar != 0))
  131.     {
  132.       if (*currentChar == '(')
  133.     {
  134. #ifdef _DEBUG_ON_
  135.       printf("Down, ");
  136. #endif
  137.  
  138.       add_variant(rootNode);
  139.       subNode = rootNode->variants;
  140.       while (subNode->next_var != NULL)
  141.         subNode = subNode->next_var;
  142.  
  143.       currentChar++;
  144.       do_variant(subNode);
  145.     }
  146.       currentChar++;
  147.     }
  148.  
  149. #ifdef _DEBUG_ON_
  150.   printf("\n\n\n");
  151. #endif
  152.  
  153.   return rootNode;
  154. }
  155.  
  156.